#include <vector>
#include <string>
#include <bitset>
#include <iostream>

using namespace std;

bool isPalindrome(const string &str) {
  auto l = str.begin();
  auto r = str.end() - 1;

  while (l < r) {
    if (*l != *r) { return false; }
    ++l;
    --r;
  }

  return true;
}

// 计算 n 的 07 倍数。
int times07(int n) {
  int i = 1;

  while (true) {
    int m = n * i;
    // 这里可以把 m 变成字符串之后再找 0 7，要比单独提取某一位数字检查简单一些。
    string mStr = to_string(m);
    bool found = true;

    for (char c : mStr) {
      if (c != '0' && c != '7') {
        found = false;
        break;
      }
    }

    if (found) {
      return m;
    }

    ++i;
  } 
}

int times07Fast(int n) {
  int i = 1;

  while (true) {
    string iStr = bitset<16>(i).to_string();
    int m = stoi(iStr) * 7;

    if (m % n == 0) {
      return m;
    }

    ++i;
  }

  // We will never get here.
  return -1;
}

// 在 1 到 50 之间找到所有 07 倍数是回文的数字
void palindrome07() {
  for (int i = 1; i <= 50; ++i) {
    int m = times07Fast(i);

    if (isPalindrome(to_string(m))) {
      cout << i << " 的 07 倍数 " << m << " 是一个回文" << endl;
    }
  }
}

int main(int argc, char const *argv[])
{
  /* code */
  // cout << times07Fast(13) << endl;
  palindrome07();
  return 0;
}
